package es.ibm.santillana.mdm.common.util;

import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ibm.ccd.common.context.AustinContext;
import com.ibm.json.java.JSONArray;
import com.ibm.json.java.OrderedJSONObject;
import com.ibm.pim.catalog.Catalog;
import com.ibm.pim.catalog.CatalogManager;
import com.ibm.pim.catalog.item.Item;
import com.ibm.pim.collaboration.CollaborationAreaManager;
import com.ibm.pim.collaboration.CollaborationItem;
import com.ibm.pim.collaboration.ItemCollaborationArea;
import com.ibm.pim.collection.PIMCollection;
import com.ibm.pim.context.Context;
import com.ibm.pim.context.PIMContextFactory;
import com.ibm.pim.hierarchy.Hierarchy;
import com.ibm.pim.hierarchy.HierarchyManager;
import com.ibm.pim.hierarchy.category.Category;
import com.ibm.pim.lookuptable.LookupTable;
import com.ibm.pim.lookuptable.LookupTableEntry;
import com.ibm.pim.lookuptable.LookupTableManager;
import com.ibm.pim.organization.Role;
import com.ibm.pim.organization.User;
import com.ibm.pim.web.framework.dispatcher.AsyncEnabled;
import com.ibm.pim.web.framework.dispatcher.RequestResponseEnabled;

import es.ibm.santillana.mdm.common.bussinesmodel.ConfigModel;

public class CustomToolUtil implements AsyncEnabled,RequestResponseEnabled {
	HttpServletRequest request;
	HttpServletResponse response;
	
	String responseContent ="";

	/* (sin Javadoc) 
	 * @see com.ibm.pim.web.framework.dispatcher.AsyncEnabled#getContentType()
	 */
	public String getContentType() {
		
		return JSON;
	}

	/* (sin Javadoc)
	 * @see com.ibm.pim.web.framework.dispatcher.AsyncEnabled#getResponseContent()
	 */
	public String getResponseContent() {
		
		return responseContent;
	}

	/* (sin Javadoc)
	 * @see com.ibm.pim.web.framework.dispatcher.RequestResponseEnabled#setRequest(javax.servlet.http.HttpServletRequest)
	 */
	public void setRequest(HttpServletRequest request) {
		this.request = request;
	}

	/* (sin Javadoc)
	 * @see com.ibm.pim.web.framework.dispatcher.RequestResponseEnabled#setResponse(javax.servlet.http.HttpServletResponse)
	 */
	public void setResponse(HttpServletResponse response) {
		this.response = response;
	}
	
	/**
	 * FlowConfig Method.
	 * @throws IOException 
	 */
	public void obtenerSociedadesNoMapeadas() throws IOException{
		AustinContext actx = (AustinContext)request.getSession().getAttribute("ctx");
		AustinContext.setCurrentContext(actx);
		
		String sPk = request.getParameter("PK");
		String sUrl = request.getParameter("URL");
		System.out.println("Request URI: "+ request.getRequestURI());
		System.out.println("Remote Addr: "+ request.getRemoteAddr());
		
		JSONArray aListOrden = obtenerInfoSociedadesNoMapeadas(sPk,sUrl);
		responseContent = aListOrden.serialize(true);		
	}
	
	/**
	 * @param sPk
	 * @param sURL
	 * @return
	 */
	private JSONArray obtenerInfoSociedadesNoMapeadas(String sPk,String sURL){
		JSONArray aListSociedades = new JSONArray();
		
		System.out.println("pkArt=" + sPk);
		
		Context ctx = PIMContextFactory.getCurrentContext();
		HierarchyManager hyMng = ctx.getHierarchyManager();
		CatalogManager ctgMng = ctx.getCatalogManager();
		
		// Cargar jerarquias Sociedadessss
		Hierarchy hySociedades = hyMng.getHierarchy(ConstSantillana.JERARQUIA_PAISES);
		
		// Cargar item del catalogo Articulos
		Catalog ctg = ctgMng.getCatalog(ConstSantillana.MAESTRO_ARTICULOS);
		Item itm = ctg.getItemByPrimaryKey(sPk);
		
		// Categorias de la jerarquia Sociedades donde esta mapeado el item
		Collection<Category> catSociedadesItem = itm.getCategories(hySociedades); 

		Collection<Category> sociedades = ConfigModel.getSociedadesNameByCountry(ConfigModel.getCountrysCodeFromUser(ctx.getCurrentUser()));
		
		for (Category sociedad : sociedades) {
			System.out.println("sociedad: " + sociedad.getDisplayName());
			if(!catSociedadesItem.contains(sociedad)) {
				System.out.println("Nombre sociedad: " + sociedad.getPrimaryKey() + "," + sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME));

				OrderedJSONObject obj = new OrderedJSONObject();
				obj.put("id", sociedad.getPrimaryKey());
				obj.put("sociedad", sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME));
				aListSociedades.add(obj);
			}
		}
		
		return aListSociedades;
	}
	
	/**
	 * FlowConfig Method.
	 * @throws IOException 
	 */
	public void obtenerSociedadesMapeadas() throws IOException{
		AustinContext actx = (AustinContext)request.getSession().getAttribute("ctx");
		AustinContext.setCurrentContext(actx);
		
		String sPk = request.getParameter("PK");
		String sUrl = request.getParameter("URL");
		String sCtgName = request.getParameter("CTGNAME");
		System.out.println("Request URI: "+ request.getRequestURI());
		System.out.println("Remote Addr: "+ request.getRemoteAddr());
		
		JSONArray aListOrden = obtenerInfoSociedadesMapeadas(sPk,sUrl,sCtgName);
		responseContent = aListOrden.serialize(true);		
	}
	public void obtenerSociedadesMapeadasPacks() throws IOException{
		System.out.println("obtenerSociedadesMapeadasPacks");
		AustinContext actx = (AustinContext)request.getSession().getAttribute("ctx");
		AustinContext.setCurrentContext(actx);
		
		String sPk = request.getParameter("PK");
		String sUrl = request.getParameter("URL");
		String sWf = request.getParameter("BWF");
		String sCtgName = request.getParameter("CTGNAME");
		System.out.println("pack sPk: " + sPk);
		System.out.println("pack: sUrl" + sUrl);
		System.out.println("pack: sWf" + sWf);
		System.out.println("pack: sCtgName" + sCtgName);
		
		System.out.println("Request URI: "+ request.getRequestURI());
		System.out.println("Remote Addr: "+ request.getRemoteAddr());
		
		JSONArray aListOrden = obtenerInfoSociedadesMapeadas(sPk,sUrl,sWf,sCtgName);
		responseContent = aListOrden.serialize(true);		
	}
	
	public void obtenerSociedadesUsuario() throws IOException{
		System.out.println("obtenerSociedadesMapeadasPacks");
		AustinContext actx = (AustinContext)request.getSession().getAttribute("ctx");
		AustinContext.setCurrentContext(actx);
		
		String sUsuario = request.getParameter("userName");
		
		
		
		
		
		JSONArray aListOrden = obtenerInfoSociedadesUsuarios(sUsuario);
		responseContent = aListOrden.serialize(true);		
	}
	
	private JSONArray obtenerInfoSociedadesUsuarios(String sUsuario){
		JSONArray aListSociedades = new JSONArray();
		System.out.println("obtenerInfoSociedadesUsuarios");
		Context ctx = PIMContextFactory.getCurrentContext();
		User user = ctx.getCurrentUser();
		PIMCollection <Role> colRoles = user.getRoles();
		System.out.println("user: " + user.getName());
		HierarchyManager hymng = ctx.getHierarchyManager();
		Hierarchy hy = hymng.getHierarchy(ConstSantillana.JERARQUIA_PAISES);
		PIMCollection <Category> paises = hy.getCategoriesAtLevel(1);
		//Para poner un option vacio
		OrderedJSONObject objVacio = new OrderedJSONObject();
		objVacio.put("id", "0");
		objVacio.put("sociedad", "Seleccione un tipo de busqueda");
		aListSociedades.add(objVacio);
		//Meto la busqueda general
		OrderedJSONObject obj = new OrderedJSONObject();
		obj.put("id", "1");
		obj.put("sociedad", "Atributos Generales");
		aListSociedades.add(obj);
		System.out.println("obtenerInfoSociedadesUsuarios");
		for (Category pais : paises) {
			System.out.println("pais: " + pais.getName());
			for (Role role:colRoles) {
				System.out.println("role" + role.getName());
				if (role.getName().equals(pais.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME))) {
					Collection <Category> sociedades = pais.getChildren();
					for (Category sociedad : sociedades) {
						System.out.println("Nombre sociedad: " + sociedad.getPrimaryKey() + "," + sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME));
	
						OrderedJSONObject obj2 = new OrderedJSONObject();
						obj2.put("id", sociedad.getPrimaryKey());
						obj2.put("sociedad", sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME));
						aListSociedades.add(obj2);
					}
				}
			}
		}
		return aListSociedades;
		
	}
	/**
	 * @param sPk
	 * @param sURL
	 * @param sCtgName 
	 * @return
	 */
	private JSONArray obtenerInfoSociedadesMapeadas(String sPk,String sURL, String sCtgName){
		JSONArray aListSociedades = new JSONArray();
		
		System.out.println("pkArt=" + sPk);
		
		
		Context ctx = PIMContextFactory.getCurrentContext();
	
		LookupTableManager lkpMan = ctx.getLookupTableManager();
		LookupTable lkp = lkpMan.getLookupTable("System Parameter LKP");
		LookupTableEntry itmLkpUser = lkp.getLookupTableEntry("user.admin.name");
		LookupTableEntry itmLkpPwd = lkp.getLookupTableEntry("user.admin.pwd");
		LookupTableEntry itmLkpCmp = lkp.getLookupTableEntry("company");
		
		String user = (String) itmLkpUser.getAttributeValue("Code_Value_LTS/Value");
		String pwd = (String) itmLkpPwd.getAttributeValue("Code_Value_LTS/Value");
		String cmp = (String) itmLkpCmp.getAttributeValue("Code_Value_LTS/Value");
		
		
		try {
			//ctx = PIMContextFactory.getContext(user, pwd, cmp);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		HierarchyManager hyMng = ctx.getHierarchyManager();
		CatalogManager ctgMng = ctx.getCatalogManager();
		
		// Cargar jerarquias Sociedades
		Hierarchy hySociedades = hyMng.getHierarchy(ConstSantillana.JERARQUIA_PAISES);
		
		// Cargar item del catalogo Articulos
		Catalog ctg = ctgMng.getCatalog(sCtgName);
		Item itm = ctg.getItemByPrimaryKey(sPk);
		
		// Categorias de la jerarquia Sociedades donde esta mapeado el item
		Collection<Category> catSociedadesItem = itm.getCategories(hySociedades); 

		Collection<Category> sociedades = ConfigModel.getSociedadesNameByCountry(ConfigModel.getCountrysCodeFromUser(ctx.getCurrentUser()));
		for (Category sociedad : sociedades) {

			if(catSociedadesItem.contains(sociedad)) {
				System.out.println("Nombre sociedad: " + sociedad.getPrimaryKey() + "," + sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME));

				OrderedJSONObject obj = new OrderedJSONObject();
				obj.put("id", sociedad.getPrimaryKey());
				obj.put("sociedad", sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME));
				aListSociedades.add(obj);
			}
		}
		
		return aListSociedades;
	}
	
	
	private JSONArray obtenerInfoSociedadesMapeadas(String sPk,String sURL, String sbWf,String sCtgName){
		JSONArray aListSociedades = new JSONArray();
		System.out.println("dentro de obetener info soci");
		System.out.println("sCtgName=" + sCtgName);
		Context ctx = PIMContextFactory.getCurrentContext();
		HierarchyManager hyMng = ctx.getHierarchyManager();
		CatalogManager ctgMng = ctx.getCatalogManager();
		
		// Cargar jerarquias Sociedades
		Hierarchy hySociedades = hyMng.getHierarchy(ConstSantillana.JERARQUIA_PAISES);
		
		// Cargar item del catalogo Articulos
		Catalog ctg = ctgMng.getCatalog(ConstSantillana.MAESTRO_ARTICULOS);
		Item itm = ctg.getItemByPrimaryKey(sPk);
		if (sCtgName.equals("Articulos")) {
			System.out.println("Soy el catalogo");
			
			// Categorias de la jerarquia Sociedades donde esta mapeado el item
			Collection<Category> catSociedadesItem = itm.getCategories(hySociedades); 
	
			Collection<Category> sociedades = ConfigModel.getSociedadesNameByCountry(ConfigModel.getCountrysCodeFromUser(ctx.getCurrentUser()));
			for (Category sociedad : sociedades) {
	
				if(catSociedadesItem.contains(sociedad)) {
					System.out.println("Nombre sociedad: " + sociedad.getPrimaryKey() + "," + sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME));
	
					OrderedJSONObject obj = new OrderedJSONObject();
					obj.put("id", sociedad.getPrimaryKey());
					obj.put("sociedad", sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME));
					aListSociedades.add(obj);
				}
			}
		}
		else {
			System.out.println("ojo ahi que soy el wf");
			CollaborationAreaManager colMng = ctx.getCollaborationAreaManager();
			ItemCollaborationArea ca = (ItemCollaborationArea) colMng.getCollaborationArea(sCtgName);
			
			CollaborationItem itmCol = ca.getCheckedOutItem(sPk); 
			Collection<Category> catSociedadesItem = itmCol.getCategories(); 
			Collection<Category> sociedades = ConfigModel.getSociedadesNameByCountry(ConfigModel.getCountrysCodeFromUser(ctx.getCurrentUser()));
			for (Category sociedad : sociedades) {
				System.out.println(sociedad.getDisplayName());
				if (!sociedad.getHierarchy().getName().equals(hySociedades.getName())) {
					sociedades.remove(sociedad);
				}
			}
			
			
			for (Category sociedad : sociedades) {
	
				if(catSociedadesItem.contains(sociedad)) {
					System.out.println("Nombre sociedad: " + sociedad.getPrimaryKey() + "," + sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME));
	
					OrderedJSONObject obj = new OrderedJSONObject();
					obj.put("id", sociedad.getPrimaryKey());
					obj.put("sociedad", sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME));
					aListSociedades.add(obj);
				}
			}
			
		}
			
		
		return aListSociedades;
	}
	
	public void obtenerSociedadesArticuloPorSociedad() {
		JSONArray aListSociedades = new JSONArray();
		
		HashMap<String, String> hSociedadesArticulo = new HashMap<String, String>();
		HashMap<String, String> hSociedadesUsuario = new HashMap<String, String>();
		
		
		String sPk = request.getParameter("PK");
		
		Context ctx = PIMContextFactory.getCurrentContext();
		User user = ctx.getCurrentUser();
		PIMCollection <Role> colRoles = user.getRoles();
		System.out.println("user: " + user.getName());
		HierarchyManager hymng = ctx.getHierarchyManager();
		Hierarchy hy = hymng.getHierarchy(ConstSantillana.JERARQUIA_PAISES);
		CatalogManager ctgMng = ctx.getCatalogManager();
		PIMCollection <Category> paises = hy.getCategoriesAtLevel(1);
				
		// Cargar item del catalogo Articulos
		Catalog ctg = ctgMng.getCatalog(ConstSantillana.MAESTRO_ARTICULOS);
		Item itm = ctg.getItemByPrimaryKey(sPk);
		
		// Categorias de la jerarquia Sociedades donde esta mapeado el item
		Collection<Category> catSociedadesItem = itm.getCategories(hy); 
		
		
		Collection<Category> sociedades = ConfigModel.getSociedadesNameByCountry(ConfigModel.getCountrysCodeFromUser(ctx.getCurrentUser()));
		for (Category sociedad : sociedades) {

			if(catSociedadesItem.contains(sociedad)) {
				System.out.println("Nombre sociedad: " + sociedad.getPrimaryKey() + "," + sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME));
				hSociedadesArticulo.put(sociedad.getPrimaryKey(), sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME).toString());
			}
		}
	
		
		for (Category pais : paises) {
			System.out.println("pais: " + pais.getName());
			for (Role role:colRoles) {
				System.out.println("role" + role.getName());
				if (role.getName().equals(pais.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME))) {
					Collection <Category> sociedadesPais = pais.getChildren();
					for (Category sociedad : sociedadesPais) {
						System.out.println("Nombre sociedad: " + sociedad.getPrimaryKey() + "," + sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME));
						hSociedadesUsuario.put(sociedad.getPrimaryKey(), sociedad.getAttributeValue(ConstSantillana.SOCIEDADES_NOMBRE_NAME).toString() );
					}
				}
			}
		}
		
		
		java.util.Iterator<Entry<String, String>> it = hSociedadesArticulo.entrySet().iterator();
		while(it.hasNext()) {
			Entry<String, String> pair = it.next();
			if (hSociedadesUsuario.containsKey(pair.getKey())) {
				OrderedJSONObject obj = new OrderedJSONObject();
				
				obj.put("id", pair.getKey());
				obj.put("sociedad", pair.getValue());
				aListSociedades.add(obj);
			}
		}
		
		try {
			responseContent = aListSociedades.serialize(true);
		} catch (IOException e) {
			e.printStackTrace();
		};
	}
}
